import { BaseDomainModel } from '@libs/models/base-domain-model';
import { DomainSnapshot } from '@libs/models/domain-snapshot';

export class {{classify modelName}} implements BaseDomainModel<I{{classify modelName}}Snapshot> {
  private id?: string;
  private name: string;

  private constructor() {
    // private constructor to force the use of the static create method
  }

  static createEmpty(): {{classify modelName}} {
    return new {{classify modelName}}();
  }

  static createById(id: string): {{classify modelName}} {
    const new{{classify modelName}} = new {{classify modelName}}();
    new{{classify modelName}}.id = id;
    return new{{classify modelName}};
  }

  static create({{camelize modelName}}: I{{classify modelName}}Snapshot): {{classify modelName}} {
    const new{{classify modelName}} = new {{classify modelName}}();
    new{{classify modelName}}.id = {{camelize modelName}}.id;
    new{{classify modelName}}.name = {{camelize modelName}}.name;
    return new{{classify modelName}};
  }

  update({{camelize modelName}}: Partial<Omit<I{{classify modelName}}Snapshot, 'id'>>): void {
    this.name = {{camelize modelName}}.name || this.name;
  }

  getSnapshot(): I{{classify modelName}}Snapshot {
    return {
      id: this.id,
      name: this.name,
    };
  }
}

export interface I{{classify modelName}}Snapshot extends DomainSnapshot {
  readonly id?: string;
  readonly name: string;
}
